//package com.junmo.oauth.config.security.authorization;
//
//
//import com.junmo.oauth.config.security.MyUserDetailService;
//import com.junmo.oauth.utils.JwtTokenUtil;
//import io.jsonwebtoken.ExpiredJwtException;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter;
//
//import javax.servlet.FilterChain;
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//
///**
// * 每次请求接口时 就会进入这里验证token 是否合法
// * 如果用户一直在操作，则token 过期时间会叠加
// * 如果超过设置的过期时间未操作  则token 失效 需要重新登录
// */
//@Component
//@Slf4j
//@AllArgsConstructor
//public class JwtAuthenticationTokenFilter  extends OncePerRequestFilter {
//    private MyUserDetailService myUserDetailService;
//    private JwtTokenUtil jwtTokenUtil;
//    @Override
//    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
////        log.info("--------JwtAuthenticationTokenFilter-----------");
//        final String requestTokenHeader = request.getHeader("Authorization");
//        String username = null;
//        String jwtToken = null;
//        // JWT报文表头的格式是"Bearer token". 去除"Bearer ",直接获取token
//        if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { // only the Token
//            jwtToken = requestTokenHeader.substring(7);
//            try {
//                username = jwtTokenUtil.getUsernameFromToken(jwtToken);
//            } catch (IllegalArgumentException e) {
//                System.out.println("Unable to get JWT Token");
//            } catch (ExpiredJwtException e) {
//                System.out.println("JWT Token has expired");
//            }
//        } else {
////            logger.warn("JWT Token does not begin with Bearer String");
//        }
//        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
//        // Once we get the token validate it.
//        if (username != null && (auth == null || auth.getPrincipal().equals("anonymousUser"))) {
//            UserDetails userDetails = this.myUserDetailService.loadUserByUsername(username);
//            // if token is valid configure Spring Security to manually set authentication
//            if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
//                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
//                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
//                usernamePasswordAuthenticationToken
//                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
//                // After setting the Authentication in the context, we specify that the current user is authenticated. So it passes the Spring Security Configurations successfully.
//                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
//            }
//        }
//        chain.doFilter(request, response);
//    }
//}
